<?php

namespace Xin\Robot\Hyperf;

use Hyperf\Context\ApplicationContext;
use Hyperf\Context\RequestContext;
use Psr\SimpleCache\CacheInterface;
use Xin\Robot\Contracts\Factory as RobotFactory;
use Xin\Robot\Monolog\Handler\AlarmHandler;
use Xin\Robot\RobotManager;
use function Hyperf\Config\config;

class ConfigProvider
{
	protected $robotFactory;

	/**
	 * @return RobotManager
	 */
	public function robotFactory()
	{
		if (!$this->robotFactory) {
			if (function_exists('\Hyperf\Config\config')) {
				$this->robotFactory = new RobotManager(\Hyperf\Config\config('robot') ?: []);
			} else {
				$this->robotFactory = new RobotManager(\config('robot') ?: []);
			}
		}

		return $this->robotFactory;
	}

	/**
	 * @return array
	 */
	public function __invoke(): array
	{

		// 设置报警缓存
		AlarmHandler::setCache(function () {
			return ApplicationContext::getContainer()->get(CacheInterface::class);
		});

		// 设置报警环境
		AlarmHandler::setAppEnv(function () {
			return config('app_env');
		});

		// 设置报警是否在web运行
		AlarmHandler::setRunningInWeb(function () {
			return RequestContext::has();
		});

		$makeHandler = \Closure::fromCallable([$this, 'robotFactory']);
		return [
			// 合并到  config/autoload/dependencies.php 文件
			'dependencies' => [
				'robot' => $makeHandler,
				RobotFactory::class => $makeHandler,
				RobotManager::class => $makeHandler,
			],
			// 组件默认配置文件，即执行命令后会把 source 的对应的文件复制为 destination 对应的的文件
			'publish' => [
				[
					'id' => 'config',
					'description' => 'Robot 是一套简单、灵活、优雅的API，目前接入了国内主流的两大办公机器人（钉钉、微信），你可以使用它快速接入你的应用，从而更快捷的实现，数据统计提醒、程序异常报警等功能。',
					// 描述
					// 建议默认配置放在 publish 文件夹中，文件命名和组件名称相同
					'source' => __DIR__ . '/../../config/config.php',  // 对应的配置文件路径
					'destination' => BASE_PATH . '/config/autoload/robot.php', // 复制为这个路径下的该文件
				],
			],
		];
	}
}
